package com.bzkj.framework.interceptor;


import com.bzkj.common.core.redis.RedisCache;
import com.bzkj.common.utils.FusionTokenUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.concurrent.TimeUnit;

/**
 * @projectName: prt-wms
 * @package: com.bzkj.framework.interceptor
 * @className: WmsRequetInterceptor
 * @description: 融合系统请求拦截器
 * @author: C1309
 * @createDate: 2025年04月16日
 * @version: v1.0
 */
@Component
public class WmsRequestInterceptor implements HandlerInterceptor {
    @Autowired
    private RedisCache redisCache;

    /**
     * 过期时间（单位：秒）
     */
    private static final int WMS_MILLIS_MINUTE = 30 * 1000;

    /**
     * 过期时间（单位：分钟）
     */
    private static final int WMS_EXPIRE_TIME = 28;

    /**
     * 临近过期时间（单位：毫秒）
     */
    private static final int MILLIS_MINUTE = 20 * 1000;

    /**
     * WMS的token过期时间（单位：分）
     */
    private static final String WMS_TOKEN_KEY = "wms:fusion:token";

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 查询融合系统token
        try {
            Object wmsToken = redisCache.getCacheObject(WMS_TOKEN_KEY);
            if (wmsToken == null) {
                /*
                 * 当WMS系统不存在融合系统token时，需要重新获取token，并缓存到redis中
                 * 当WMS系统中存在融合系统token时，判断token是否过期，如果过期则重新获取token，并缓存到redis中
                 * 当WMS系统中存在融合系统token时，判断token是否过期，如果过期时间小于20分钟则延长过期时间（请求时触发，不请求则不触发）
                 */
                synchronized (this) {
                    wmsToken = redisCache.getCacheObject(WMS_TOKEN_KEY);

                    if (wmsToken == null) {
                        // 获取融合Token
                        String token = FusionTokenUtils.getToken();
                        if (token.trim().isEmpty()) {
                            return false;
                        } else {
                            // 缓存融合Token
                            redisCache.setCacheObject(WMS_TOKEN_KEY, token, WMS_EXPIRE_TIME, TimeUnit.MINUTES);
                        }
                        return true;
                    }
                }
            }

            if (redisCache.getExpire(WMS_TOKEN_KEY) < MILLIS_MINUTE) {
                // 延长过期时间
                redisCache.expire(WMS_TOKEN_KEY, WMS_EXPIRE_TIME, TimeUnit.MINUTES);
            }
        } catch (Exception e) {
//            logger.error("Failed to handle WMS token", e);
            response.setStatus(HttpStatus.SERVICE_UNAVAILABLE.value());
            return false;
        }
        return true;
    }
}
